package com.example.mgsnew.listeners;

import com.alibaba.nacos.common.utils.StringUtils;
import com.aliyun.oss.ServiceException;
import com.example.common.constants.MqConstants;
import com.example.common.domain.Messages.FileMgs;
import com.example.common.utils.AliOssUtil;
import com.example.common.utils.UUIDUtil;
import com.example.mgsnew.Service.FileService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
@Slf4j
public class FileListener {
    @Autowired
    private final AliOssUtil aliOssUtil;
    @Autowired
    private final FileService fileService;

    //    上传文件
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = MqConstants.QUEUE_FILE_SAVE),
            exchange = @Exchange(name = MqConstants.EXCHANGE_FILE, type = ExchangeTypes.TOPIC),
            key = MqConstants.ROUTING_KEY_FILE_SAVE
    ))
    public void FileUpload(FileMgs fileMgs) {
        if (fileMgs == null || fileMgs.getFile() == null) {
            log.error("文件上传失败，参数为空");
            return;
        }
        try {
            // 构建文件存储路径：类型/ID/文件名（(哪个功能模块+文件后缀名)（目录）+文件名字+10位数的uuid+.后缀名）
            // 构建文件存储路径：类型/ID/文件名（(哪个功能模块+文件后缀名)（目录）+12位数的uuid+.后缀名） 这里跟修改文件的重新构建文件名一样
            String filePath = fileMgs.getType() + "/" + fileMgs.getFileType() + "/" +
                    UUIDUtil.generate(12) + "." + fileMgs.getFileType();
            String url = aliOssUtil.saveFile(filePath, fileMgs.getFile());
            // 可添加后续逻辑：将URL存入数据库或发送消息通知
            log.info("文件上传成功，URL: {}", url);
        } catch (Exception e) {
            log.error("文件上传异常，type={}, fileId={}", fileMgs.getType(), fileMgs.getFileId(), e);
            throw new ServiceException("文件上传失败");
        }
    }

    //    删除文件
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = MqConstants.QUEUE_FILE_DELETE),
            exchange = @Exchange(name = MqConstants.EXCHANGE_FILE, type = ExchangeTypes.TOPIC),
            key = MqConstants.ROUTING_KEY_FILE_DELETE
    ))
    public void FileDelete(FileMgs fileMgs) {
        if (fileMgs == null) {
            log.error("文件删除失败，FileMgs对象为空");
            return;
        }
        if (StringUtils.isEmpty(fileMgs.getFilePath())) {
            log.error("文件删除失败，缺少文件路径");
            return;
        }
        try {
            // 1. 获取文件路径（从fileMgs或数据库查询）
            String filePath = fileMgs.getFilePath();
            if (StringUtils.isEmpty(filePath)) {
                log.warn("文件删除失败，未找到文件路径，fileId: {}", fileMgs.getFileId());
                return;
            }
            // 2. 调用OSS删除接口
            aliOssUtil.deleteFile(filePath);
        } catch (Exception e) {
            log.error("文件删除异常，fileId: {}", fileMgs.getFileId(), e);
            throw new ServiceException("文件删除失败");
        }
    }

    //    修改文件
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = MqConstants.QUEUE_FILE_UPDATE),
            exchange = @Exchange(name = MqConstants.EXCHANGE_FILE, type = ExchangeTypes.TOPIC),
            key = MqConstants.ROUTING_KEY_FILE_UPDATE
    ))
    public void FileUpdate(FileMgs fileMgs) {
        if (fileMgs == null) {
            log.error("文件修改失败，FileMgs对象为空");
            return;
        }
        if (fileMgs.getFile() == null && StringUtils.isEmpty(fileMgs.getFilePath())) {
            log.error("文件修改失败，缺少文件内容或原文件路径");
            return;
        }
        try {
            // 1. 解析原文件路径（从fileMgs中获取或从数据库查询）
            String originalFilePath = fileMgs.getFilePath();
            if (StringUtils.isEmpty(originalFilePath)) {
                log.error("文件修改失败，未找到原文件路径，fileId: {}", fileMgs.getFileId());
                return;
            }
            // 2. 构建新文件路径（保持与上传一致的命名规则）
            String newFilePath = fileMgs.getType() + "/" + fileMgs.getFileType() + "/" +
                    UUIDUtil.generate(12) + "." + fileMgs.getFileType();

            // 3. 上传新文件
            String newUrl = aliOssUtil.saveFile(newFilePath, fileMgs.getFile());

            // 4. 删除原文件
            boolean deleteSuccess = aliOssUtil.deleteFile(originalFilePath);
            if (!deleteSuccess) {
                log.warn("原文件删除失败，新文件已上传，原路径: {}", originalFilePath);
            }
            log.info("文件修改成功，fileId: {}, 新URL: {}", fileMgs.getFileId(), newUrl);
        } catch (Exception e) {
            log.error("文件修改异常，type: {}, fileId: {}", fileMgs.getType(), fileMgs.getFileId(), e);
            throw new ServiceException("文件修改失败");
        }
    }


}
